package cn.wangjie.spark.start

import org.apache.spark.sql.{DataFrame, Dataset, SparkSession}

/**
 * 使用SparkSQL中SQL方式分析数据，进行词频统计WordCount
 */
object SparkSQLWordCount {

  def main(args: Array[String]): Unit = {
		
		// 1. 创建SparkSession实例对象，通过建造者模式
		val spark: SparkSession = SparkSession.builder()
			// 设置应用名称
			.appName(this.getClass.getSimpleName.stripSuffix("$"))
			// 设置运行模式
			.master("local[2]")
			.getOrCreate()
		// 导入隐式转换函数
		import spark.implicits._
		
		// 2. 加载文本数据
		val inputDS: Dataset[String] = spark.read.textFile("datas/wordcount/wordcount.data")
		//println(s"Count = ${inputDS.count()}")
		//inputDS.show(5, truncate = false)
		
		// TODO: 3. 对数据进行分割为单词
		val wordsDS: Dataset[String] = inputDS
			// 过滤不合格的数据
			.filter(line => null != line && line.trim.length > 0)
			// 每行数据进行分割
			.flatMap(line => line.trim.split("\\s+"))
		
		// TODO: 4. 使用SQL分析数据
		// 4.1 将Dataset/DataFrame注册为临时视图
		wordsDS.createOrReplaceTempView("view_tmp_words")
		// 4.2 编写SQL，使用sparkSession执行
		val resultDF: DataFrame = spark.sql(
			"""
			  |SELECT value, COUNT(1) AS cnt FROM view_tmp_words GROUP BY value
			  |""".stripMargin)
		
		resultDF.printSchema()
		resultDF.show(10, truncate = false)
		
		
		// 应用结束，关闭资源
		spark.stop()
	}
}
